home *** CD-ROM | disk | FTP | other *** search
- ;----------------------------------------------------------------------------
- ;
- ; $Source: /unixb/home/unixlib/source/unixlib37/src/sys/s/RCS/_vfork,v $
- ; $Date: 1996/11/06 22:01:42 $
- ; $Revision: 1.3 $
- ; $State: Rel $
- ; $Author: unixlib $
- ;
- ; $Log: _vfork,v $
- ; Revision 1.3 1996/11/06 22:01:42 unixlib
- ; Yet more changes by NB, PB and SC.
- ;
- ; Revision 1.2 1996/10/30 21:59:00 unixlib
- ; Massive changes made by Nick Burret and Peter Burwood.
- ;
- ; Revision 1.1 1996/04/19 21:34:32 simon
- ; Initial revision
- ;
- ;----------------------------------------------------------------------------
-
- GET Unix37:unixlib.s.asm_dec
-
- AREA |C$$code|,CODE,READONLY
-
- IMPORT |__vfork|
- IMPORT |__vexit|
- IMPORT |__dynamic_num|
- IMPORT |__break|
-
- IMPORT setjmp
- IMPORT longjmp
-
- EXPORT vfork
-
- NAME vfork
- vfork
- STMFD sp!,{v1,lr}
- MOV v1,sp
- BL |__vfork|
- MOV sp,v1
- ; If zero was returned, we will return -1
- CMP a1,#0
- MVNEQ a1,#0
- LDMEQFD sp!,{v1,pc}^
- LDMFD sp!,{v1,lr}
- ; save lr for use when setjmp returns either immediately or
- ; via longjmp as spawned program exits and current program
- ; starts running again.
- LDR a2,[pc,#|__saved_lr_ptr|-.-8]
- STR lr,[a2,#0]
- BL setjmp
- LDR a2,[pc,#|__saved_lr_ptr|-.-8]
- LDR lr,[a2,#0]
- TEQ a1,#0
- MOVEQS pc,lr
-
- ; Restore dynamic area size to size indicated by __break
- ; which was the size of the area before the forked program
- ; ran and extended the dynamic area. We can't do this anywhere
- ; before this point (e.g., in the called program) since some
- ; pointers may need copying down from the spawned program's area.
- STMFD sp!,{a1,a2,a3,a4,v1,v2,v3,v4,v5,lr}
- LDR a2,[pc,#|__dynamic_num_ptr|-.-8]
- LDR a2,[a2,#0]
- CMN a2,#1
- LDMEQFD sp!,{a1,a2,a3,a4,v1,v2,v3,v4,v5,pc}^
- MOV a1,#2
- SWI XOS_DynamicArea
- MOVVC a1,a2
- ADDVC a3,a3,a4
- LDRVC a2,[pc,#|__break_ptr|-.-8]
- LDRVC a2,[a2,#0]
- SUBVC a2,a2,a3
- SWIVC XOS_ChangeDynamicArea
- LDMFD sp!,{a1,a2,a3,a4,v1,v2,v3,v4,v5,pc}^
-
- EXPORT |__vret|
- |__vret|
- BL |__vexit|
- LDR a2,[a1,#52]
- B longjmp
-
- |__saved_lr_ptr|
- DCD |__saved_lr|
- |__dynamic_num_ptr|
- DCD |__dynamic_num|
- |__break_ptr|
- DCD |__break|
-
- AREA |C$$data|, DATA
- |__saved_lr|
- DCD 0
-
- END
-